home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************)
- (* N_EditLn *)
- (* *)
- (* General Purpose line editor, based on EDITLN by Borland *)
- (* Modified for use with multiple lines by *)
- (* Bob Gibson of BGShareWare *)
- (* *)
- (****************************************************************)
-
- unit N_EditLn;
- {$D-,I-,S-}
- interface
- uses Scrn;
-
- const
- NULL = #0;
- BS = #8;
- LF = #10;
- CR = #13;
- ESC = #27;
- Space = #32;
- Tab = ^I;
-
- { The following constants are based on the scheme used by the scan key
- function to convert a two key scan code sequence into one character
- by adding 128 to the ordinal value of the second character.
- }
- F1 = #187;
- F2 = #188;
- F3 = #189;
- F4 = #190;
- F5 = #191;
- F6 = #192;
- F7 = #193;
- F8 = #194;
- F9 = #195;
- F10 = #196;
- UpKey = #200;
- DownKey = #208;
- LeftKey = #203;
- RightKey = #205;
- PgUpKey = #201;
- PgDnKey = #209;
- HomeKey = #199;
- EndKey = #207;
- InsKey = #210;
- DelKey = #211;
- M : Word = 0;
- var
- O, N, R, P : byte;
- Ch : Char;
- T : String;
-
- type
- CharSet = set of char;
-
- procedure EditLine(var S : String;
- Len, X, Y : byte;
- LegalChars,
- Term : CharSet;
- var TC : Char );
- { EditLn implements a line editor that supports WordStar commands
- as well as left-right arrow keys , Home, End, back space, etc.
- Paramaters:
- S : String to be edited
- Len : Maximum characters allowed to be edited
- X, Y : Starting x an y cordinates
- LegalChars : Set of characters that will be accepted
- Term : Set of characters that will cause EditLine to Exit
- (Note LegalChars need not contain Term)
- TC : Character that caused EditLn to exit
- }
-
- function ScanKey : char;
- { Reads a key from the keyboard and converts 2 scan code escape
- sequences into 1 character. }
-
- implementation
- {$L keys}
- Function KeyPressed : Boolean ; External;
- Function ReadKey : Char ; External;
-
- function ScanKey : char;
- { Reads a key from the keyboard and converts 2 scan code escape
- sequences into 1 character. }
-
- var
- Ch : Char;
- begin
- Ch := ReadKey;
- if (Ch = #0) {and KeyPressed} then
- begin
- Ch := ReadKey;
- if ord(Ch) < 128 then
- Ch := Chr(Ord(Ch) + 128);
- end;
- ScanKey := Ch;
- end; { ScanKey }
-
- procedure EditLine(var S : String;
- Len, X, Y : byte;
- LegalChars, Term : CharSet;
- var TC : Char);
- { EditLn implements a line editor that supports WordStar commands
- as well as left-right arrow keys , Home, End, back space, etc.
- Paramaters:
- S : String to be edited
- Len : Maximum characters allowed to be edited
- X, Y : Starting x an y cordinates
- LegalChars : Set of characters that will be accepted
- Term : Set of characters that will cause EditLine to Exit
- (Note LegalChars need not contain Term)
- TC : Character that caused EditLn to exit
- }
- {$V-}
-
- begin
- PXY(X,Y);
- PWrite(S);
- P := Y - 1;
- N := Y;
- O := X;
- Y := 1;
- M := 0;
- Mem[$40:$17] := (Mem[$40:$17] AND $7F);
- repeat
- If ((Mem[$40:$17] AND $80) = $80) Then SetCursor(0,7) Else SetCursor(6,7);
- If (Y+P) > 80 Then Begin
- Inc(X);
- P := 0;
- End;
- PXY(X,Y+P);
- Ch := ScanKey;
- if not (Upcase(Ch) in Term) then
- case Ch of
- #32..#126 : if (M < Len) and
- (ch in LegalChars) then
- begin
- P := succ(P);
- M := succ(M);
- If ((Mem[$40:$17] AND $80) = $80) Then
- Delete(S,M,1);
- If ((Mem[$40:$17] AND $80) <> $80) Then
- If Length(S) = Len Then Delete(S,Len,1);
- Insert(Ch,S,M);
- T := Copy(S,M,Len);
- PWrite(T);
- end
- Else Writeln(^G);
- ^S, LeftKey : if M > 0 then Begin
- If P < 1 Then Begin
- P := 80;
- Dec(X);
- End;
- P := pred(P);
- M := pred(M);
- End;
- ^D, RightKey : if M < Length(S) then Begin
- P := succ(P);
- M := succ(M);
- End;
- HomeKey : Begin
- M := M - P;
- P := 0;
- End;
- EndKey : Begin
- M := M + (79 - P);
- P := 79;
- If M > Length(S) Then Begin
- P := P - (M - Length(S));
- M := Length(S);
- End;
- End;
- UpKey : If X > O Then Begin
- Dec(X);
- M := M - 80;
- End;
- DownKey : If (M+80) < Length(S) Then Begin
- Inc(X);
- M := M + 80;
- If M > Length(S) Then Begin
- P := P - (M - Length(S));
- M := Length(S);
- End;
- End;
- DelKey : if M < Length(S) then
- begin
- Delete(S,M + 1,1);
- T := Copy(S,M+1,Len);
- T := T + ' ';
- PWrite(T);
- end;
- BS : if M > 0 then
- begin
- Delete(S,M,1);
- T := Copy(S,M,Len);
- If (Y+P-1) < 1 Then Begin
- Dec(X);
- P := (81-Y);
- PXY(X,P);
- End
- Else PXY(X,Y+P-1);
- T := T + ' ';
- PWrite(T);
- P := pred(P);
- M := pred(M);
- end;
- F9 : Begin
- X := O;
- Y := 1;
- For R := 1 To Len Do PWrite(' ');
- P := 0;
- S := '';
- M := 0;
- End;
- else;
- end; {of case}
- until UpCase(Ch) in Term;
- SetCursor(6,7);
- PXY(X,Y+P);
- M := Length(S);
- For R := 1 To (Len-M) Do PWrite('');
- TC := Upcase(Ch);
- end; { EditLine }
-
- end.
-
- USE XX34 to decode this object code. You MUST Have it to use this unit
- Also, you will need the SCRN.PAS from the SCREEN.SWG packet.
-
-
- *XX3401-000092-070293--68--85-59342--------KEYS.OBJ--1-OF--1
- U+M+-2h3KJAuZUQ+++F1HoF3F7U5+0UI++6-+G4E5++++Ed9FJZEIYJHIoJ2++++-p73
- EIF9FJY7+++pc-U++E++h+5B3bHug+51JMjgh+TB6MjZLQD6WU6++5E+
- ***** END OF XX-BLOCK *****
-
-